package cn.org.xwb.common.mail.utils;

import cn.org.xwb.common.mail.dto.MailSendInfoDto;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

/**
 * 和电子邮件相关的工具类
 */
@Component
@Log4j2
public class MailUtil {

    private MailUtil() {
    }

    /**
     * 邮件发送对象
     */
    @Autowired
    private JavaMailSender mailSender;

    /**
     * 判断邮箱是否合法
     *
     * @param mail 需要进行判断的邮箱
     * @return true 邮箱合法；false 邮箱不合法
     */
    public boolean mailIsLegal(String mail) {
        // 如果邮箱字符串为空则邮箱不合法
        if (mail == null || mail.isEmpty()) return false;
        // 用于判断邮箱是否合法的正则表达式
        String emailReg = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
        // 匹配成功返回 true，否则返回 false
        return mail.matches(emailReg);
    }

    /**
     * 发送纯文本邮件信息
     * 代码参考来源：https://blog.csdn.net/qq_42320934/article/details/124021133
     *
     * @param mailSendInfo 发送邮件所需的相关信息
     * @return true 发送成功；false 发送失败
     */
    public Boolean sendMessage(MailSendInfoDto mailSendInfo) {
        // 发送邮件所需的相关信息
        String from = mailSendInfo.getFrom();
        String to = mailSendInfo.getTo();
        String subject = mailSendInfo.getSubject();
        String content = mailSendInfo.getContent();
        try {
            // 创建邮件对象
            SimpleMailMessage msg = new SimpleMailMessage();
            // 设置发送方
            msg.setFrom(from);
            // 设置接收方
            msg.setTo(to);
            // 设置邮件主题
            msg.setSubject(subject);
            // 设置邮件内容
            msg.setText(content);
            // 发送邮件
            mailSender.send(msg);
            log.info("邮件发送成功，发送方：{}，接收方：{}，邮件主题：{}", from, to, subject);
            return true;
        } catch (MailException e) {
            log.error("邮件发送失败，发送方：{}，接收方：{}，邮件主题：{}，\n错误信息：{}，\nerror：{}", from, to, subject, e.getMessage(), e);
            return false;
        }
    }

    /**
     * 发送邮件内容为 HTML 的邮件
     * 代码参考：https://blog.csdn.net/huang714/article/details/130698204
     *
     * @param mailSendInfo 发送邮件所需的相关信息
     * @return true 发送成功；false 发送失败
     */
    public Boolean sendHTMLMessage(MailSendInfoDto mailSendInfo) {
        // 发送邮件所需的相关信息
        String from = mailSendInfo.getFrom();
        String to = mailSendInfo.getTo();
        String subject = mailSendInfo.getSubject();
        String content = mailSendInfo.getContent();
        try {
            // 媒体类型的邮件对象
            MimeMessage mimeMessage = mailSender.createMimeMessage();
            // 媒体类型的邮件对象设置帮助器
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
            // 设置发送方
            mimeMessageHelper.setFrom(from);
            // 设置接收方
            mimeMessageHelper.setTo(to);
            // 设置邮件主题
            mimeMessageHelper.setSubject(subject);
            // 设置邮件内容，并开启 HTML 标签识别
            mimeMessageHelper.setText(content, true);
            // 发送邮件
            mailSender.send(mimeMessage);
            log.info("邮件发送成功，发送方：{}，接收方：{}，邮件主题：{}", from, to, subject);
            return true;
        } catch (MessagingException e) {
            log.error("邮件发送失败，发送方：{}，接收方：{}，邮件主题：{}，\n错误信息：{}，\nerror：{}", from, to, subject, e.getMessage(), e);
            return false;
        }
    }

}
